package com.tuozixuan.liteflow.component;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;

/**
 * <pre>
 * 普通组件节点需要继承NodeComponent，可用于THEN和WHEN关键字中。
 * 需要实现process方法
 * </pre>
 */
@LiteflowComponent("generalComponentExample")
public class GeneralComponentExample extends NodeComponent {
	
	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	@Override
	public void process() throws Exception {
		
		logger.info("process start");
		logger.info("nodeId:{}", this.getNodeId());
		logger.info("name:{}", this.getName());
		//logger.info("chainName:{}", this.getChainName());
		logger.info("chainId:{}", this.getChainId());
		logger.info("tag:{}", this.getTag());
		logger.info("process end");
	}

	/**
	 * 推荐实现isAccess方法，表示是否进入该节点，可以用于业务参数的预先判断
	 */
	@Override
	public boolean isAccess() {
		logger.info("isAccess()...");
		return true;
	}
	
	/**
	 * 表示出错是否继续往下执行下一个组件，默认为false
	 */
	@Override
	public boolean isContinueOnError() {
		logger.info("isContinueOnError()...");
		return false;
	}
	
	/**
	 * 如果覆盖后，返回true，则表示在这个组件执行完之后立马终止整个流程。对于这种方式，由于是用户主动结束的流程，属于正常结束，所以最终的isSuccess是为true的。<br/>
	 * 
	 * 需要注意的是，如果isContinueOnError为true的情况下，调用了this.setIsEnd(true)，那么依旧会终止。response里的isSuccess还是true。
	 */
	@Override
	public boolean isEnd() {
		logger.info("isEnd()...");
		return false;
	}
	
	/**
	 * 流程的前置處理，在isAccess 之后执行。
	 */
	@Override
	public void beforeProcess() {
		logger.info("beforeProcess()...");
	}
	
	/**
	 * 流程的後置處理
	 */
	@Override
	public void afterProcess() {
		logger.info("afterProcess()...");
	}
	
	/**
	 * 流程的成功事件回调
	 */
	@Override
	public void onSuccess() throws Exception {
		logger.info("onSuccess()...");
	}
	
	/**
	 * 流程的失败事件回调
	 */
	@Override
	public void onError(Exception e) throws Exception {
		logger.info("onError()...");
	}
	
	/**
	 * 流程失败后的回滚方法
	 */
	@Override
	public void rollback() throws Exception{
		logger.info("rollback()...");
	}
}
